/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.manager.pesquisar;

import br.com.foxinline.enums.Situacao;
import br.com.foxinline.modelo.Curso;
import br.com.foxinline.modelo.Disciplina;
import br.com.foxinline.modelo.Docente;
import br.com.foxinline.servico.CursoServico;
import br.com.foxinline.servico.DisciplinaServico;
import br.com.foxinline.servico.DocenteServico;
import br.com.foxinline.servico.UsuarioServico;
import br.com.foxinline.utilitario.Msg;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

/**
 *
 * @author laverson
 */
@ViewScoped
@ManagedBean
public class ManagerPesquisarDocente implements Serializable {

    @EJB
    DocenteServico docenteServico;
    @EJB
    CursoServico cursoServico;
    @EJB
    DisciplinaServico disciplinaServico;
    @EJB
    UsuarioServico usuarioServico;
    private Docente docentePesquisar;
    private Docente docenteEditar;
    private Docente docenteVisualizar;
    private Docente docenteDelete;
    private List<Docente> docentes;
    private Disciplina disciplina;
    private List<Disciplina> disciplinasPesquisar;
    private List<Disciplina> disciplinasEditar;
    private List<Disciplina> disciplinasVisualizar;
    private List<Disciplina> disciplinasSelecionadas;
    private List<Disciplina> disciplinasSelecionadasEditar;
    private Curso cursoPesquisar;
    private Curso cursoEditar;
    private List<Curso> cursos;
    private String eDocente;
    private String vDocente;

    @PostConstruct
    public void init() {
        cursoPesquisar = isAdmin() ? new Curso() : usuarioServico.getCurrentUser().getCurso();
        cursos = cursoServico.pesquisarTodos();
        docentePesquisar = new Docente();
        disciplinasPesquisar = new ArrayList<Disciplina>();
        disciplinasSelecionadas = new ArrayList<Disciplina>();

        Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        eDocente = params.get("eDocente");
        vDocente = params.get("vDocente");
        paramPost();
        
        handleMudarDisciplinas();
    }

    public void paramPost() {
        if (eDocente != null) {
            docenteEditar = docenteServico.pesquisar(Long.parseLong(eDocente));
            disciplinasSelecionadasEditar = docenteEditar != null ? docenteEditar.getDisciplinas() : new ArrayList<Disciplina>();
            if (!disciplinasSelecionadasEditar.isEmpty()) {
                cursoEditar = disciplinasSelecionadasEditar.get(0).getCurso();
            } else {
                cursoEditar = new Curso();
            }
            disciplinasEditar = disciplinaServico.pesquisar(cursoEditar);
        }
        if (vDocente != null) {
            docenteVisualizar = docenteServico.pesquisar(Long.parseLong(vDocente));
            disciplinasVisualizar = docenteVisualizar.getDisciplinas();
        }
    }

    public void pesquisar() {
        docentePesquisar.setDisciplinas(disciplinasSelecionadas);

        docentes = docenteServico.pesquisar(docentePesquisar, cursoPesquisar);
    }

    public void atualizar() {
        try {
            docenteEditar.setDisciplinas(disciplinasSelecionadasEditar);
            docenteServico.atualizar(docenteEditar);
            Msg.messagemInfo(Msg.SuccessFull);
        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
    }

    public List<SelectItem> getSituacao() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Situacao ms : Situacao.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public void handleMudarDisciplinas() {
        if (cursoPesquisar != null && cursoPesquisar.getId() != null) {
            disciplinasPesquisar = disciplinaServico.pesquisar(cursoPesquisar);
        } else {
            disciplinasPesquisar = new ArrayList<Disciplina>();
        }
    }

    public String disciplinas(Docente item) {

        String dis = "";
        for (int i = 0; i < item.getDisciplinas().size(); i++) {
            dis += item.getDisciplinas().get(i).getNome();

            if (item.getDisciplinas().size() > 1 && i > 0) {
                if (i < item.getDisciplinas().size() - 1) {
                    dis += ", ";
                } else {
                    dis += " e ";
                }
            }
        }

        return dis;
    }

    public String cursos(Docente item) {

        String dis = "";
        for (int i = 0; i < item.getDisciplinas().size(); i++) {
            dis += item.getDisciplinas().get(i).getCurso().getNome();

            if (item.getDisciplinas().size() > 1 && i > 0) {
                if (i < item.getDisciplinas().size() - 1) {
                    dis += ", ";
                } else {
                    dis += " e ";
                }
            }
        }

        return dis;
    }

    public void deletar() {
        try {
            docenteServico.deletar(docenteDelete);
            docentes.remove(docenteDelete);
            Msg.messagemInfo(Msg.SuccessFull);
        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
    }
    
    public boolean isAdmin(){
        return usuarioServico.isAdmin();
    }

    public Curso getCursoEditar() {
        return cursoEditar;
    }

    public void setCursoEditar(Curso cursoEditar) {
        this.cursoEditar = cursoEditar;
    }

    public Curso getCursoPesquisar() {
        return cursoPesquisar;
    }

    public void setCursoPesquisar(Curso cursoPesquisar) {
        this.cursoPesquisar = cursoPesquisar;
    }

    public List<Curso> getCursos() {
        return cursos;
    }

    public void setCursos(List<Curso> cursos) {
        this.cursos = cursos;
    }

    public Disciplina getDisciplina() {
        return disciplina;
    }

    public void setDisciplina(Disciplina disciplina) {
        this.disciplina = disciplina;
    }

    public List<Disciplina> getDisciplinasEditar() {
        return disciplinasEditar;
    }

    public void setDisciplinasEditar(List<Disciplina> disciplinasEditar) {
        this.disciplinasEditar = disciplinasEditar;
    }

    public List<Disciplina> getDisciplinasPesquisar() {
        return disciplinasPesquisar;
    }

    public void setDisciplinasPesquisar(List<Disciplina> disciplinasPesquisar) {
        this.disciplinasPesquisar = disciplinasPesquisar;
    }

    public List<Disciplina> getDisciplinasSelecionadas() {
        return disciplinasSelecionadas;
    }

    public void setDisciplinasSelecionadas(List<Disciplina> disciplinasSelecionadas) {
        this.disciplinasSelecionadas = disciplinasSelecionadas;
    }

    public List<Disciplina> getDisciplinasSelecionadasEditar() {
        return disciplinasSelecionadasEditar;
    }

    public void setDisciplinasSelecionadasEditar(List<Disciplina> disciplinasSelecionadasEditar) {
        this.disciplinasSelecionadasEditar = disciplinasSelecionadasEditar;
    }

    public List<Disciplina> getDisciplinasVisualizar() {
        return disciplinasVisualizar;
    }

    public void setDisciplinasVisualizar(List<Disciplina> disciplinasVisualizar) {
        this.disciplinasVisualizar = disciplinasVisualizar;
    }

    public Docente getDocenteEditar() {
        return docenteEditar;
    }

    public void setDocenteEditar(Docente docenteEditar) {
        this.docenteEditar = docenteEditar;
    }

    public Docente getDocentePesquisar() {
        return docentePesquisar;
    }

    public void setDocentePesquisar(Docente docentePesquisar) {
        this.docentePesquisar = docentePesquisar;
    }

    public Docente getDocenteVisualizar() {
        return docenteVisualizar;
    }

    public void setDocenteVisualizar(Docente docenteVisualizar) {
        this.docenteVisualizar = docenteVisualizar;
    }

    public List<Docente> getDocentes() {
        return docentes;
    }

    public void setDocentes(List<Docente> docentes) {
        this.docentes = docentes;
    }

    public Docente getDocenteDelete() {
        return docenteDelete;
    }

    public void setDocenteDelete(Docente docenteDelete) {
        this.docenteDelete = docenteDelete;
    }
}
